#study7从 集合 到 字符串的相关操作

#集合；集合相当于是不带value的字典
#集合的创建
s={'test',123,2.71828}#方法一
s1=set(['TEST',456,3.14159,456])#方法二
print(s,s1)#重复的元素会被自动删除
print(set(range(6)))#产生0到5的集合
print(set([123,'test',456]))#将列表转换为集合
print(set((111,222)))#将元组转变为集合(集合是无序的，所以可能会乱序），比如：
print(set('Python'))
print(set())#空集合的定义，注意！不能直接空的花括号，否则数据类型是字典

#集合的操作
print(123 in s)#集合元素的判断用 in 或 not in

#集合元素的添加
s.add(3.14)#只在集合中添加一个元素用add()
print(s)#注意，集合中添加的元素是没有固定顺序的
s.add(('hello','world'))#添加一个元组
print(s)
s.update([200,300])#update添加多个元素，原数据类型将没有影响
print(s)
s.update({400,500})
print(s)
s.update((600,700))
print(s)

#集合元素的删除
s.remove(500)#remove删除指定元素，如果没有该元素则抛出异常
print(s)
s.discard(3.14)#discard删除指定元素，如果没有该元素不抛出异常
print(s)
s.pop()#删除第一个位置的数字
print(s)
s.clear()#将集合清空
print(s)

s2 = {123,'test',2.71828,3.14159,456,'TEST'}
#集合的判断
print(s == s1)#用 == 或 != 来判断两个集合是否相等，元素的位置不对不会影响最终结果
print(s1.issubset(s2))#用issubclass来判断s1是否是s2的子集
print(s1.issuperset(s2))#判断s1是否是s2的超集
print(s1.isdisjoint(s2))#判断s1和s2是否有交集(有交集为False，无交集为Ture)

#集合的数据操作（和数学的集合完全一模一样）
s3 = {123,345,3.14,2.71828,'test'}
s4 = {123,456,2.71828,3.14159,'test','TEST'}
#交集
print(s3.intersection(s4))  # 方法一
print(s3 & s4)  # 方法二
#并集
print(s3.union(s4))
print(s3 | s4)
#差集
print(s3.difference(s4))
print(s3 - s4)
print(s3)  # 但差集操作之后两个原集合没有发生变化
print(s4)
#对称差集
print(s3.symmetric_difference(s4))
print(s3 ^ s4)

#集合生成式
s5 = {i + 1 for i in range(6)}
print(s5)

#字符串
#字符串的驻留机制
a = 'test'
b = "test"
c = '''test'''
print(a, id(a))
print(b, id(b))
print(c, id(c))# 字符串内存地址相同，a，b，c实际上存储的是对应字符串的内存地址（is似乎可以比较内存地址是否相同）
a, b = 'ab%', "ab%"
print(a is b, a == b)# 例子
a, b = 'abc', ('ab' + 'c')# 这两种方式在程序运行之前就已经编译好了
c = "".join(['ab', 'c'])# 在运行中生成了字符串'abc'
# [-5, 256]之间的整数数字也符合驻留机制
a, b = 'ab%', "ab%"
print(a is b) # 可以通过sys.intern()来解决这个问题
import sys
a = sys.intern(b)
print(a is b)

# 字符串的查找操作（strStr）
d = 'hello,hello'
print(d.index('lo'), d.find('lo'), d.rindex('lo'), d.rfind('lo'))# 当字符串不存在的时候，index抛出ValueError异常，而find返回结果-1

# 字符串的大小写操作（注：不论是否转换大小写，字符串==比较输出结果为True）
e = "Test5"
print(e.upper())# 将所有字母都转为大写
print(e.lower())# 把所有字母都转为小写
print(e.swapcase())# 将字符串中所有小写字母转为大写，大写字母转为小写
print(e.capitalize())# 将第一个字母转为大写，其余转为小写
e = 'test, tEst'
print(e.title())# 将字符串中每个单词的开头转为大写，其余转为小写

# 字符串的对齐
f = 'test'
print(f.center(10, '*'))# 居中操作，10为长度（如果长度小于原字符串的话会输出原字符串），’*‘是填充空白用的（不用默认是空格）（后面几个一样，除了最后一个）
print(f.center(11, '*'))
print(f.ljust(10))# 左对齐
print(f.rjust(10))# 右对齐
print(f.zfill(10))# 右对齐，但用0填充，所以只有一个参数
print('-5'.zfill(5))# 绕过负号用0填充

# 字符串的劈分
g = 'a b c,d'
print(g.split())# 默认以空格为分隔，输出一个列表，也可以用参数spe指定其他分隔符，还可以用maxsplit参数指定最大的劈分次数
print(g.split(sep=',', maxsplit=5))
# rsplit从右边开始劈分，具体操作都差不多

# 字符串的判断
h = ''
print('8he'.isidentifier())